/*
 * @Author: zi.yang
 * @Date: 2021-05-24 12:46:45
 * @LastEditors: zi.yang
 * @LastEditTime: 2021-10-03 03:47:27
 * @Description: 常用正则校验表达式
 * @FilePath: \ziYangPM\src\Utils\validate.js
 */
export default {
  /**
   * 身份证号(15位、18位数字)，最后一位是校验位，可能为数字或字符X
   * @param {string} str
   * @returns {Boolean}
   */
  isIdCard: (str) => {
    const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    return reg.test(str)
  },
  /**
   * 手机号
   * @param {string} str
   * @returns {Boolean}
   */
  isPhone: (str) => {
    const reg =
      /^1((3[\d])|(4[5,6,9])|(5[0-3,5-9])|(6[5-7])|(7[0-8])|(8[1-3,5-8])|(9[1,8,9]))\d{8}$/
    return reg.test(str)
  },
  /**
   * email地址
   * @param {string} str
   * @returns {Boolean}
   */
  isEmail: (str) => {
    const reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
    return reg.test(str)
  },
  /**
   * 国内座机电话,如: 0341-86091234
   * @param {string} str
   * @returns {Boolean}
   */
  isTelCode: (str) => {
    const reg = /\d{3}-\d{8}|\d{4}-\d{7}/
    return reg.test(str)
  },
  /**
   * 是否电话格式(手机和座机)
   * @param {string} str
   * @returns {Boolean}
   */
  isTelPhone: (str) => {
    const reg = /^((0\d{2,3}-\d{7,8})|(1[345789]\d{9}))$/
    return reg.test(str)
  },
  /**
   * 帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线组合)
   * @param {string} str
   * @returns {Boolean}
   */
  isAccount: (str) => {
    const reg = /^[a-zA-Z][a-zA-Z0-9_]{4,15}$/
    return reg.test(str)
  },
  /**
   * 只包含中文
   * @param {string} str
   * @returns {Boolean}
   */
  isChinese: (str) => {
    const reg = /^[\u4E00-\u9FA5]+$/
    return reg.test(str)
  },
  /**
   * 是否小数
   * @param {string} str
   * @returns {Boolean}
   */
  isDecimal: (str) => {
    const reg = /^\d+\.\d+$/
    return reg.test(str)
  },
  /**
   * 是否纯数字
   * @param {string} str
   * @returns {Boolean}
   */
  isStudentNo: (str) => {
    const reg = /^[0-9]+$/
    return reg.test(str)
  },
  /**
   * 是否html标签
   * @param {string} str
   * @returns {Boolean}
   */
  isHtmlTag: (str) => {
    const reg = /<(.*)>.*<\/\1>|<(.*) \/>/
    return reg.test(str)
  },
  /**
   * 是否由数字和字母组成
   * @param {string} str
   * @returns {Boolean}
   */
  isNumbersAndLetters: (str) => {
    const reg = /^[A-Za-z0-9]+$/
    return reg.test(str)
  },

  /**
   * 是否都是小写
   * @param {string} str
   * @returns {Boolean}
   */
  isLowerCase: (str) => {
    const reg = /^[a-z]+$/
    return reg.test(str)
  },

  /**
   * 是否都是大写
   * @param {string} str
   * @returns {Boolean}
   */
  isUpperCase: (str) => {
    const reg = /^[A-Z]+$/
    return reg.test(str)
  },

  /**
   * 是否是英文字符
   * @param {string} str
   * @returns {Boolean}
   */
  isAlphabets: (str) => {
    const reg = /^[A-Za-z]+$/
    return reg.test(str)
  },

  /**
   * 不包含字母
   * @param {string} str
   * @returns {Boolean}
   */
  isNoLetter: (str) => {
    const reg = /^[^A-Za-z]+$/
    return reg.test(str)
  },

  /**
   * 密码强度正则，最少8位，包括至少1个大写字母，1个小写字母，1个数字，1个特殊字符
   * @param {string} str
   * @returns {Boolean}
   */
  isPassword: (str) => {
    const reg = /^.*(?=.{8})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/

    return reg.test(str) && str.length <= 16
  },

  /**
   * 用户名正则，4到16位（字母，数字，下划线，减号）
   * @param {string} str
   * @returns {Boolean}
   */
  isUsername: (str) => {
    const reg = /^[a-zA-Z0-9_-]{4,16}$/
    return reg.test(str)
  },

  /**
   * ipv4地址正则
   * @param {string} str
   * @returns {Boolean}
   */
  isIPv4: (str) => {
    const reg =
      /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
    return reg.test(str)
  },

  /**
   * 16进制颜色
   * @param {string} str
   * @returns {Boolean}
   */
  isHexadecimal: (str) => {
    const reg = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
    return reg.test(str)
  },

  /**
   * 微信号，6至20位，以字母开头，字母，数字，减号，下划线
   * @param {string} str
   * @returns {Boolean}
   */
  isWeixin: (str) => {
    const reg = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/
    return reg.test(str)
  },

  /**
   * 中国邮政编码
   * @param {string} str
   * @returns {Boolean}
   */
  isPostalCode: (str) => {
    const reg = /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/
    return reg.test(str)
  },

  /**
   * 是否是外部链接
   * @param {string} path
   * @returns {Boolean}
   */
  isExternal: (path) => /^(https?:|mailto:|tel:)/.test(path),

  /**
   * 是否是 url
   * @param {string} url
   * @returns {Boolean}
   */
  isURL: (url) => {
    const reg =
      /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
    return reg.test(url)
  },

  /**
   * 检查日期格式,例：2021-5-25
   * @param {string} str
   * @returns {Boolean}
   */
  isDate: (str) => {
    const reg = /^\d{4}(-)\d{1,2}\1\d{1,2}$/
    return reg.test(str)
  },

  /**
   * 是否是字符串
   * @param {string} str
   * @returns {Boolean}
   */
  isString: (str) => {
    if (typeof str === 'string' || str instanceof String) {
      return true
    }
    return false
  },

  /**
   * 是否是数组
   * @param {Array} arg
   * @returns {Boolean}
   */
  isArray: (arg) => {
    if (typeof Array.isArray === 'undefined') {
      return Object.prototype.toString.call(arg) === '[object Array]'
    }
    return Array.isArray(arg)
  }
}
